package cn.chinaunicom.mini.program.dingtalk.openapi.client;

import java.net.InetSocketAddress;
import java.net.Proxy;

import com.aliyun.teaopenapi.models.Config;
import org.apache.commons.lang3.StringUtils;

import com.dingtalk.api.DefaultDingTalkClient;
import com.taobao.api.ApiException;
import com.taobao.api.TaobaoRequest;
import com.taobao.api.TaobaoResponse;

import cn.chinaunicom.mini.program.dingtalk.openapi.model.props.DingTalkProps;
import cn.hutool.extra.spring.SpringUtil;

/**
 * author ：dutp date ：Created in 2022/12/5 16:54
 * <p>
 * 抽出ding talk 的client，方便proxy
 * </p>
 */
public class IDingTalkClient {

	private IDingTalkClient() {
		throw new IllegalStateException("Utility class");
	}
	/**
	 * 执行钉钉接口请求。
	 *
	 * 通过传入的URL和请求对象，使用钉钉SDK执行请求，并返回处理后的响应对象。 如果配置了HTTP代理，会使用代理进行请求。
	 *
	 * @param url         钉钉接口的URL地址。
	 * @param request     钉钉请求对象，包含请求的具体参数。
	 * @param accessToken 访问令牌，用于身份验证。
	 * @param <T>         响应对象的类型，继承自TaobaoResponse。
	 * @return 执行请求后的响应对象。
	 * @throws ApiException 如果请求执行过程中出现错误，抛出ApiException。
	 */
	public static <T extends TaobaoResponse> T execute(String url, TaobaoRequest<T> request, String accessToken)
			throws ApiException {
		/* 获取钉钉配置属性，用于后续判断是否使用代理 */
		/* 钉钉api限制20qps */
		DingTalkProps dtProps = SpringUtil.getBean(DingTalkProps.class);
		/* 创建钉钉客户端对象 */
		DefaultDingTalkClient client = new DefaultDingTalkClient(url);
		/* 判断是否配置了HTTP代理，并设置代理 */
		if (dtProps.getHttpProxy() != null && StringUtils.isNotBlank(dtProps.getHttpProxy().getIp())) {
			/* 构建代理对象 */
			InetSocketAddress socketAddress = new InetSocketAddress(dtProps.getHttpProxy().getIp(),
					dtProps.getHttpProxy().getPort());
			Proxy proxy = new Proxy(Proxy.Type.HTTP, socketAddress);
			/* 设置客户端使用的代理 */
			client.setProxy(proxy);
		}

		/* 执行钉钉请求，并返回响应对象 */
		return client.execute(request, accessToken);
	}

	/**
	 * 生成新版钉钉openapi客户端配置
	 * @return
	 */
	public static Config genDingTalkClientConfig() {
		Config config = new Config();
		config.protocol = "https";
		config.regionId = "central";
		return config;
	}

}
